# 1️⃣ 导入库并读取数据
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# 读取 GitHub 上的企鹅数据集
url = "https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to-machine-learning/main/Data/ml-basics/penguins.csv"
df = pd.read_csv(url)

# 为了在后续绘图时显示中文（如果需要）
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 2️⃣ 查看前 5 行数据
df.head()
# 3️⃣ 绘制各物种的数量柱状图
plt.figure(figsize=(6,4))
sns.countplot(data=df, x="Species", palette="Set2")
plt.title("企鹅物种分布")
plt.xlabel("物种")
plt.ylabel("数量")
plt.show()
# 4️⃣ 用箱线图展示 FlipperLength、CulmenLength、CulmenDepth 在不同物种间的分布
plt.figure(figsize=(12,4))

plt.subplot(1,3,1)
sns.boxplot(data=df, x="Species", y="FlipperLength", palette="Set3")
plt.title("Flipper Length")

plt.subplot(1,3,2)
sns.boxplot(data=df, x="Species", y="CulmenLength", palette="Set3")
plt.title("Culmen Length")

plt.subplot(1,3,3)
sns.boxplot(data=df, x="Species", y="CulmenDepth", palette="Set3")
plt.title("Culmen Depth")

plt.tight_layout()
plt.show()
# 5️⃣ 查看包含缺失值的行
df[df.isnull().any(axis=1)]
# 6️⃣ 删除所有缺失值所在的行（后续建模直接使用干净的数据）
df_clean = df.dropna().reset_index(drop=True)
df_clean.shape   # 查看清理后的数据规模
# 7️⃣ 准备特征和标签
# 特征：CulmenLength、CulmenDepth、FlipperLength
# 标签：Species
X = df_clean[["CulmenLength", "CulmenDepth", "FlipperLength"]]
y = df_clean["Species"]
# 8️⃣ 按 70%/30% 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.30, random_state=42, stratify=y
)
# 9️⃣ 创建并训练多分类 Logistic Regression 模型
# 使用 multinomial 方式并指定 solver 为 'lbfgs'（适用于小数据集）
model = LogisticRegression(multi_class="multinomial", solver="lbfgs", max_iter=200)
model.fit(X_train, y_train)
# 🔟 评估模型：预测测试集并计算准确率
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"模型在测试集上的准确率：{accuracy:.2%}")
